﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Configuration;
using System.IO;

namespace He.Common
{
    public class PathHelper
    {
        /// <summary>
        /// 返回与 Web 服务器上指定XML文件的虚拟路径相对应的物理文件路径
        /// </summary>
        /// <param name="nodeName">AppSettings的节点名称</param>
        /// <returns>与 path 相对应的物理文件路径</returns>
        public static string MapXmlPath(string nodeName)
        {
            return MapPath(ConfigurationManager.AppSettings[nodeName]);
        }

        #region 获得当前绝对路径
        /// <summary>
        /// 返回与 Web 服务器上的指定虚拟路径相对应的物理文件路径。
        /// </summary>
        /// <param name="strPath">Web 服务器的虚拟路径</param>
        /// <returns>与 path 相对应的物理文件路径</returns>
        public static string MapPath(string strPath)
        {
            if (strPath.ToLower().StartsWith("http://"))
            {
                return strPath;
            }
            if (HttpContext.Current != null)
            {
                return HttpContext.Current.Server.MapPath(strPath);
            }
            else //非web程序引用
            {
                strPath = strPath.Replace("/", "\\");
                if (strPath.StartsWith("\\"))
                {
                    strPath = strPath.Substring(strPath.IndexOf('\\', 1)).TrimStart('\\');
                }
                return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
            }
        }
        #endregion

        #region 获取空间大小
        public static long GetDirectoryLength(string dirPath)
        {

            //判断给定的路径是否存在,如果不存在则退出
            if (!Directory.Exists(dirPath)) return 0;                
            long len = 0;
            //定义一个DirectoryInfo对象
            DirectoryInfo di = new DirectoryInfo(dirPath);
            //通过GetFiles方法,获取di目录中的所有文件的大小
            foreach (FileInfo fi in di.GetFiles())
            {
                len += fi.Length;
            }
            //获取di中所有的文件夹,并存到一个新的对象数组中,以进行递归
            DirectoryInfo[] dis = di.GetDirectories();
            if (dis.Length > 0)
            {
                for (int i = 0; i < dis.Length; i++)
                {
                    len += GetDirectoryLength(dis[i].FullName);
                }
            }
            return len;
        } 
        #endregion
    }
}
